package opf5.ui;

import java.awt.EventQueue;

import javax.print.attribute.standard.MediaSize.Other;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JTable;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JLabel;
import javax.transaction.Transactional.TxType;

import opf5.entities.calificaciones.CalculadorPromedios;
import opf5.entities.dominio.Jugador;
import opf5.entities.excepciones.OperacionNoPermitidaException;
import opf5.entities.filtrosJugadores.FiltroConInfracciones;
import opf5.entities.filtrosJugadores.FiltroHandicap;
import opf5.entities.filtrosJugadores.FiltroJugadores;
import opf5.entities.filtrosJugadores.FiltroNacimientoAnterior;
import opf5.entities.filtrosJugadores.FiltroNombreComienzaCon;
import opf5.entities.filtrosJugadores.FiltroPasanTodos;
import opf5.entities.filtrosJugadores.FiltroPromedioUltimoPartido;
import opf5.entities.filtrosJugadores.FiltroSinInfracciones;
import opf5.entities.repositorios.RepositorioJugadores;
import opf5.entities.repositorios.RepositorioJugadoresPersistente;
import opf5.persistencia.OPF5DBGateway;
import opf5.utilidades.Fecha;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.List;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeEvent;

public class VistaBusquedaJugadores {

	private JFrame frame;
	private JTextField txtbusqueda1;
	private JTextField txtbusqueda2;
	private OPF5TablaJugadores tablaJugadores;
	private JComboBox comboBox;
	private RepositorioJugadores repositorio;
	private JLabel lblInicio;
	private JLabel lblFin;

	
	public VistaBusquedaJugadores(RepositorioJugadores repositorio) {
		this.repositorio = repositorio;
	}
	
	/**
	 * Initialize the contents of the frame.
	 * @wbp.parser.entryPoint
	 */
	public void initialize() {
		frame = new JFrame();
		frame.setBounds(100, 100, 450, 435);
		frame.getContentPane().setLayout(null);
		
		txtbusqueda1 = new JTextField();
		txtbusqueda1.setBounds(174, 64, 152, 20);
		frame.getContentPane().add(txtbusqueda1);
		txtbusqueda1.setColumns(10);
		
		JButton btnBuscar = new JButton("Buscar");
		btnBuscar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				try {
					runRealizarBusqueda();
				} catch (OperacionNoPermitidaException e) {
					JOptionPane.showMessageDialog(frame, e.mensaje);
				}
			}
		});
		btnBuscar.setBounds(237, 30, 89, 23);
		frame.getContentPane().add(btnBuscar);
		
		txtbusqueda2 = new JTextField();
		txtbusqueda2.setBounds(174, 95, 152, 20);
		frame.getContentPane().add(txtbusqueda2);
		txtbusqueda2.setColumns(10);
		
		tablaJugadores = new OPF5TablaJugadores();
		tablaJugadores.setBounds(10, 126, 414, 219);
		frame.getContentPane().add(tablaJugadores);
		
		JButton btnVolver = new JButton("Volver");
		btnVolver.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				runVolver();
			}
		});
		btnVolver.setBounds(335, 363, 89, 23);
		frame.getContentPane().add(btnVolver);
		
		JLabel lblCriterioDeBusqueda = new JLabel("Criterio de busqueda");
		lblCriterioDeBusqueda.setBounds(10, 11, 184, 14);
		frame.getContentPane().add(lblCriterioDeBusqueda);
		
		lblInicio = new JLabel("Inicio");
		lblInicio.setBounds(20, 67, 142, 14);
		frame.getContentPane().add(lblInicio);
		
		lblFin = new JLabel("Fin");
		lblFin.setBounds(20, 98, 144, 14);
		frame.getContentPane().add(lblFin);

		comboBox = new JComboBox();
		comboBox.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				actualizarInterfaz();
			}
		});
		comboBox.setModel(new DefaultComboBoxModel(new String[] {
				"Nombre comienza con",
				"Nacimiento anterior",
				"Handicap",
				"Promedio",
				"Con infracciones",
				"Sin infracciones",
				"Todos"}));
		
		comboBox.setSelectedIndex(0);
		comboBox.setBounds(10, 31, 184, 20);
		frame.getContentPane().add(comboBox);

		
		final VistaBusquedaJugadores window = this;
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	protected void runVolver() {
		this.frame.setVisible(false);
	}

	protected void actualizarInterfaz() {
		switch(this.comboBox.getSelectedIndex()) {
		case 0:
			this.actualizarCampos("Comienza con: ", "", true, false);
			break;
		case 1:
			this.actualizarCampos("Fecha:", "", true, false);
			break;
		case 2:
			this.actualizarCampos("Desde:", "Hasta:", true, true);
			break;
		case 3:
			this.actualizarCampos("Desde:", "Hasta:", true, true);
			break;
		default:
			this.actualizarCampos("", "", false, false);
		}
	}

	
	
	private void actualizarCampos(String label1, String label2, boolean txt1Visible, boolean txt2Visible) {
		this.lblInicio.setText(label1);
		this.lblFin.setText(label2);		
		this.txtbusqueda1.setVisible(txt1Visible);
		this.txtbusqueda2.setVisible(txt2Visible);
	}

	protected void runRealizarBusqueda() {
		tablaJugadores.limpiar();
		FiltroJugadores filtro = getFiltro();
		List<Jugador> resultadoBusqueda = this.repositorio.filtrarJugadores(filtro);
		this.tablaJugadores.cargarJugadoresModelo(resultadoBusqueda);
	}

	private FiltroJugadores getFiltro() {
		switch(this.comboBox.getSelectedIndex()) {
		case 0:
			return new FiltroNombreComienzaCon(this.txtbusqueda1.getText());
		case 1:
			return new FiltroNacimientoAnterior(getFecha());
		case 2:
			return getFiltroHandicap();
		case 3:
			return getFiltroPromedio();
		case 4:
			return new FiltroConInfracciones();
		case 5:
			return new FiltroSinInfracciones();
		}
		
		return new FiltroPasanTodos();
	}

	private FiltroJugadores getFiltroPromedio() {
		String desde = this.txtbusqueda1.getText();
		String hasta = this.txtbusqueda2.getText();

		if (! (desde.matches("[0-9]*") && hasta.matches("[0-9]*")) ||
				desde.isEmpty() && hasta.isEmpty())
			throw new OperacionNoPermitidaException("Ingrese numeros validos");
		
		FiltroPromedioUltimoPartido f =  new FiltroPromedioUltimoPartido();

		if (! desde.isEmpty() && ! hasta.isEmpty())
			return new FiltroPromedioUltimoPartido(new Double(desde), new Double(hasta));
		else if (hasta.isEmpty())
			f.setDesde(new Double(desde));
		else
			f.setHasta(new Double(hasta));
		
		return f;
	}

	private FiltroJugadores getFiltroHandicap() {
		String desde = this.txtbusqueda1.getText();
		String hasta = this.txtbusqueda2.getText();
		if (! (desde.matches("[0-9]*") && hasta.matches("[0-9]*")) ||
				desde.isEmpty() && hasta.isEmpty())
			throw new OperacionNoPermitidaException("Ingrese numeros validos");
		
		FiltroHandicap f =  new FiltroHandicap();

		if (! desde.isEmpty() && ! hasta.isEmpty()) {
			return new FiltroHandicap(new Integer(desde), new Integer(hasta));
		} else if (hasta.isEmpty()) {
			f.setDesde(new Integer(desde));
		} else {
			f.setHasta(new Integer(hasta));
		}
		
		return f;
	}

	
	private Fecha getFecha() {
		String fecha = this.txtbusqueda1.getText();
		if (! this.txtbusqueda1.getText().matches("[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}"))
			throw new OperacionNoPermitidaException("El formato de la fecha debe ser dd/MM/yyyy");

		try {
			return new Fecha(fecha, "dd/MM/yyyy");
		} catch (Exception e) {
			throw new OperacionNoPermitidaException("El formato de la fecha debe ser dd/MM/yyyy");
		}
	}
}